package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.imut.lagain.entity.Notification;
import com.imut.lagain.entity.NotificationTemplate;
import com.imut.lagain.entity.WechatNotification;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 微信通知记录服务接口
 */
public interface IWechatNotificationService extends IService<WechatNotification> {
    
    /**
     * 根据用户ID和事件类型查询微信通知记录
     * @param userId 用户ID
     * @param eventType 事件类型
     * @param page 分页参数
     * @return 微信通知记录分页列表
     */
    IPage<WechatNotification> findByUserIdAndEventType(Long userId, String eventType, Page<WechatNotification> page);
    
    /**
     * 根据发送状态查询微信通知记录
     * @param sendStatus 发送状态
     * @param page 分页参数
     * @return 微信通知记录分页列表
     */
    IPage<WechatNotification> findBySendStatus(String sendStatus, Page<WechatNotification> page);
    
    /**
     * 查询待发送的微信通知记录
     * @param size 记录数量
     * @return 微信通知记录列表
     */
    List<WechatNotification> findPendingNotifications(int size);
    
    /**
     * 更新发送状态
     * @param id 通知记录ID
     * @param sendStatus 发送状态
     * @param sendTime 发送时间
     * @return 是否成功
     */
    boolean updateSendStatus(Long id, String sendStatus, LocalDateTime sendTime);
    
    /**
     * 统计不同发送状态的通知数量
     * @return 统计结果
     */
    List<Object[]> countBySendStatus();
    
    /**
     * 根据用户ID获取待发送的微信通知记录
     * @param userId 用户ID
     * @param size 记录数量
     * @return 微信通知记录列表
     */
    List<WechatNotification> getPendingNotificationsByUserId(Long userId, int size);
    
    /**
     * 根据用户ID获取微信通知记录
     * @param userId 用户ID
     * @param page 分页参数
     * @param eventType 事件类型
     * @param sendStatus 发送状态
     * @return 微信通知记录分页列表
     */
    IPage<WechatNotification> getWechatNotificationsByUserId(Long userId, Page<WechatNotification> page, String eventType, String sendStatus);
    
    /**
     * 根据用户ID获取通知统计信息
     * @param userId 用户ID
     * @return 统计信息
     */
    java.util.Map<String, Object> getNotificationStatsByUserId(Long userId);
    
    /**
     * 发送模板消息
     * @param notification 通知对象
     * @param template 通知模板
     * @param data 模板数据
     * @return 是否发送成功
     */
    boolean sendTemplateMessage(Notification notification, NotificationTemplate template, Map<String, Object> data);

    boolean sendTextMessage(String openId, String content);

    boolean sendImageMessage(String openId, String mediaId);

    boolean sendVoiceMessage(String openId, String mediaId);

    boolean sendVideoMessage(String openId, String mediaId, String title, String description);

    boolean sendMusicMessage(String openId, String title, String description, String musicUrl, String hqMusicUrl, String thumbMediaId);

    boolean sendNewsMessage(String openId, String title, String description, String url, String picUrl);

    String getAccessToken();

    String refreshAccessToken();

    String uploadTempMedia(String type, String filePath);

    String uploadPermanentMedia(String type, String filePath, String title, String introduction);

    Map<String, Object> getUserInfo(String openId);

    boolean createMenu(String menuJson);

    boolean deleteMenu();

    Map<String, Object> getMenu();

    boolean setIndustry(String industryId1, String industryId2);

    String getTemplateId(String templateIdShort);

    Map<String, Object> getAllPrivateTemplate();

    boolean deleteTemplate(String templateId);

    boolean checkSignature(String signature, String timestamp, String nonce, String token);

    String handleMessage(String xmlData);

    String handleEvent(String xmlData);
}
